package cn.tedu.csmall.order.webapi.service.impl;
 /*
 @Time: 2022/11/23 21:24
 @Author:GShuai
 @File:OrderImpl.class
 @Software:IntelliJ IDEA
*/


import cn.tedu.csmall.cart.service.ICartService;
import cn.tedu.csmall.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall.commons.pojo.order.model.OrderTb;
import cn.tedu.csmall.commons.pojo.stock.dto.StockReduceCountDTO;
import cn.tedu.csmall.commons.restful.JsonPage;
import cn.tedu.csmall.order.service.IOrderService;
import cn.tedu.csmall.order.webapi.mapper.OrderMapper;
import cn.tedu.csmall.stock.service.IStockService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

// business 模块会调用order模块的业务方法，所以order模块任然需要编写生产者需要的注解
@DubboService
@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {
    @Autowired
    private OrderMapper orderMapper;

    // 当前order模块消费stock模块的减少库存的方法
    // 因为stock模块减少库存的方法已经注册到Nacos,所以当前order模块可以利用Dubbo调用
    // 要想调用就必须使用@DubboReference，才能获得业务逻辑层对象
    @DubboReference
    private IStockService dubbostockService;
    // 还需要cart模块服务,  （用dubbo业务层变量名用dubbo开头）
    @DubboReference
    private ICartService dubboCartService;

    @Override
    public void orderAdd(OrderAddDTO orderAddDTO) {
        // 1.减少订单商品的库存数（要调用stock模块的方法）
        // 实例化减少库存业务的DTO并赋值
        StockReduceCountDTO stockReduceCountDTO = new StockReduceCountDTO();
        stockReduceCountDTO.setCommodityCode(orderAddDTO.getCommodityCode());
        stockReduceCountDTO.setReduceCount(orderAddDTO.getCount());
        // Dubbo调用业务逻辑层方法,减少库存
        dubbostockService.reduceCommodityCount(stockReduceCountDTO);
        // 2.删除订单中勾选的购物车中的商品（要调用cart模块的方法）
        dubboCartService.deleteUserCart(orderAddDTO.getUserId(),orderAddDTO.getCommodityCode());
        // 3.新增订单
        OrderTb order = new OrderTb();
        BeanUtils.copyProperties(orderAddDTO,order);
        //执行新增
        orderMapper.insertOrder(order);
        log.info("新增的订单信息：{}",order);

    }

    // 分页查询所有订单的方法
    // pageNum 是页码
    // pageSize 是每页条数
    public JsonPage<OrderTb> getAllOrdersByPage(Integer pageNum, Integer pageSize){
        // 要想实现pageHelper的分页，首先要执行要分页的查询之前
        // 设置分页的条件，也就是要查第几页，每页多少条
        // 这里的pageNum和pageSize分页不同，1就是第一页，2就是第二页
        PageHelper.startPage(pageNum,pageSize);
        // 上面设置完成后，下面在运行的查询语句，就会自动按照给定的pageNum,pageSize生成limit之后的sql语句了
        List<OrderTb> list = orderMapper.findAllOrders();
        // 上面的查询结果就是分页结果，list集合中只有指定页面的数据，并不是全查
        // 下面在方法返回时，不能返回List对象，因为嗨需要返回分页信息
        // PageHelper框架提供了PageInfo类型对象，既包含查询到的结果，能包含分页信息（自动计算得来）
        return JsonPage.restPage(new PageInfo<>(list));

    }
}
